package com.rabbitmq.comsumer.listener;

import com.alibaba.fastjson2.JSON;
import com.rabbitmq.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.data.web.JsonPath;
import org.springframework.stereotype.Component;

/**
 * @作者: 林江
 * @创建时间: 2023/12/6
 * @功能: 测试rabbitmq中集中消息转换机制
 * 1. SimpleMessageConverter -- 默认的转换机制
 */
@Slf4j
@Component
public class RabbitMqMessageConvertListener {
    /*---------------------------SimpleMessageConverter-------------------------------------*/

    /**
     * SimpleMessageConverter中，将消息转换为Message实列时，
     * 消息是以字节数组的形式封装在里面的。
     *
     * @param message
     */
//    @RabbitListener(queues = "test04")
    public void SimpleMessageConverterListener(Message message) {
        log.info("RabbitMqMessageConvertListener，消息对象【Message】，SimpleMessageConverter开始处理。。。。。。。。。");
        byte[] body = message.getBody();
        System.out.println(new String(body));
    }

    /**
     * Rabbitmq从message中将消息转换为对应的实列。默认是转换为UTF-8编码的字符串
     *
     * @param msg
     */
//    @RabbitListener(queues = "test04")
    public void SimpleMessageConverterListener(String msg) {
        log.info("RabbitMqMessageConvertListener，消息对象【String】，SimpleMessageConverter开始处理。。。。。。。。。");
        System.out.println(new String(msg));
    }

    /**
     * Rabbitmq从message中将消息转换为对应的java对象的时候。
     * 需要“消息提供者”设置message的content_type = application/x-java-serialized-object
     * 进行序列化
     *
     * @param user
     */
//    @RabbitListener(queues = "test04")
    public void SimpleMessageConverterListener(User user) {
        log.info("RabbitMqMessageConvertListener，消息对象【对象实列】，SimpleMessageConverter开始处理。。。。。。。。。");
        System.out.println("我叫" + user.getName() + ",今年" + user.getAge() + "岁");
    }

    /*---------------------------jacksonMessageConverter-------------------------------------*/

    /**
     * 使用jackson，将json消息直接转换为对象实列
     *
     * @param user
     */
//    @RabbitListener(queues = "test04")
    public void jacksonMessageConverterListener(User user) {
        log.info("RabbitMqMessageConvertListener，消息对象【对象实列】，JacksonMessageConverter开始处理。。。。。。。。。");
//        User user = JSON.parseObject(message.getBody(), User.class);
        System.out.println("我叫" + user.getName() + ",今年" + user.getAge() + "岁");
    }

//    @RabbitListener(queues = "test04")
    public void jacksonMessageConverterListener(Message message) {
        log.info("RabbitMqMessageConvertListener，消息对象【Message】，JacksonMessageConverter开始处理。。。。。。。。。");
        User user = JSON.parseObject(message.getBody(), User.class);
        System.out.println("我叫" + user.getName() + ",今年" + user.getAge() + "岁");
    }

    /**
     * 监听器的参数是一个接口类型。
     *  jackson需要配置
     *      converter.setUseProjectionForInterfaces(true);
     *
     * @param someSample
     */
    @RabbitListener(queues = "test04")
    public void jacksonMessageConverterListener(SomeSample someSample) {
        log.info("RabbitMqMessageConvertListener，消息对象【接口形式】，JacksonMessageConverter开始处理。。。。。。。。。");
        System.out.println("我叫" + someSample.getName());
    }


    interface SomeSample {
        /**
         * 依赖
         * <dependency>
         * <groupId>org.springframework.data</groupId>
         * <artifactId>spring-data-commons</artifactId>
         * <version>2.4.0</version>
         * </dependency>
         *
         * @return
         */
        @JsonPath({"$.name","$.user.name"})
        String getName();
    }
}
